In [68]:
datos1 = pd.DataFrame([24, np.nan, np.nan, 23,np.nan, 12, np.nan, 17, np.nan, 2 ,5], columns = list('A'))
datos1
Out[68]:
En dropna()
el argumento subset
considera la etiqueta para seleccionar el conjunto a descartar, axis=0
descarta filas (axis=1
columnas) y inplace= True
hace que los cambios se ejecuten directamente en DataFrame
.
In [62]:
datos1.dropna(subset=['A'], axis= 0, inplace= True)
datos1
Out[62]:
La función replace()
permite reemplazar valores faltantes en el DataFrame
por valores nuevos. En nuestro ejemplo, reemplazaremos con el promedio, que se calcula con la función mean()
.
In [63]:
datos1 = pd.DataFrame([24, np.nan, np.nan, 23,np.nan, 12, np.nan, 17, np.nan, 2 ,5], columns = list('A'))
media = datos1['A'].mean()
media
Out[63]:
Ahora usamos la función replace()
In [23]:
datos1['A'].replace(np.nan, media, inplace = True)
datos1
Out[23]:
In [70]:
import pandas as pd
compra_1 = pd.Series({'Nombre': 'Adelis',
'Artículo comprado': 'Libro',
'Costo': 1200})
compra_2 = pd.Series({'Nombre': 'Miguel',
'Artículo comprado': 'Raspberry pi 3',
'Costo': 15000})
compra_3 = pd.Series({'Nombre': 'Jaime',
'Artículo comprado': 'Balón',
'Costo': 5000})
df = pd.DataFrame([compra_1, compra_2, compra_3], index=['Tienda 1', 'Tienda 1', 'Tienda 2'])
df
Out[70]:
Podemos agregar elementos al DataFrame
de la siguiente manera:
In [71]:
df['Fecha'] = ['Diciembre 1', 'Febrero 4', 'Mediados de Julio']
df
Out[71]:
In [72]:
df['Entregado'] = 'Sí'
df
Out[72]:
In [73]:
df['Retroalimentación'] = ['Positiva', None, 'Negativa']
df
Out[73]:
Pandas reset_index ()
es un método para restablecer el índice de un DataFrame
. El establece como índices una lista de enteros que van desde 0 hasta la longitud de los datos.
In [74]:
adf = df.reset_index()
adf
Out[74]:
Podemos tener un par de tablas de datos que nos interese unir o combinar en un mismo DataFrame
.
In [75]:
empleados_df = pd.DataFrame([{'Nombre': 'Adriana', 'Función': 'Gerente de ventas'},
{'Nombre': 'Andrés', 'Función': 'Vendedor 1'},
{'Nombre': 'Cristóbal', 'Función': 'Gerente de departamento'}])
empleados_df = empleados_df.set_index('Nombre')
grado_df = pd.DataFrame([{'Nombre': 'Andrés', 'Grado': 'Nivel 3'},
{'Nombre': 'Cristóbal', 'Grado': 'Nivel 1'},
{'Nombre': 'Adriana', 'Grado': 'Nivel 2'}])
grado_df = grado_df.set_index('Nombre')
print(empleados_df.head())
print()
print(grado_df.head())
pd.merge()
conecta filas en el DataFrames
basado en una o más teclas. Para los conocedores de SQL esta función hace unión de bases de datos por columnas o índices.
In [76]:
df_info_empleados=pd.merge(empleados_df, grado_df, how='outer', left_index=True, right_index=True)
df_info_empleados
Out[76]:
Otros ejemplos de cómo variar el parámetro how
se pueden encontrar en el libro Python for Data Analysis - McKinney.
Supongamos que tenemos ahora un nuevo DataFrame
que coincide en número de filas con el anterior. Por ejemplo:
In [77]:
fecha_ingreso_df = pd.DataFrame([{'Nombre': 'Adriana', 'Fecha de Ingreso': '20/06/2013'},
{'Nombre': 'Andrés', 'Fecha de Ingreso': '10/01/2018'},
{'Nombre': 'Cristóbal', 'Fecha de Ingreso': '20/03/2011'}])
fecha_ingreso_df = fecha_ingreso_df.set_index('Nombre')
art_vendidos_df = pd.DataFrame([{'Nombre': 'Adriana', 'Art.Vendidos/Total Art.': 123/10000},
{'Nombre': 'Andrés', 'Art.Vendidos/Total Art.': 1450/10000},
{'Nombre': 'Cristóbal', 'Art.Vendidos/Total Art.': 5000/10000}])
art_vendidos_df = art_vendidos_df.set_index('Nombre')
print(fecha_ingreso_df.head())
print(art_vendidos_df.head())
pd.concat()
pega o apila objetos a lo largo de un eje.
In [87]:
new_data = pd.concat([df_info_empleados, fecha_ingreso_df, art_vendidos_df], axis=1)
new_data
Out[87]:
Hay mucho más que aprender! Por ejemplo: ¿Qué sucede si axis=0
? R: pues posiblemente el resultado sea que Pandas pegue todos los valores y sus índices. Como se muestra a continuación:
In [80]:
pd.concat([df_info_empleados, fecha_ingreso_df, art_vendidos_df], axis=0)
Out[80]:
Otra transformación de interés podría ser hacer algún cálculo sobre una columna entera. En nuestro ejemplo, supongamos que deseamos colocar % de artículos vendidos y cambiar la etiqueta de esa columna.
In [89]:
new_data
new_data['Art.Vendidos/Total Art.']= new_data['Art.Vendidos/Total Art.']*100
new_data.rename(columns = {'Art.Vendidos/Total Art.': '% Art. Vendidos'}, inplace = True)
new_data
Out[89]:
Tomemos un DataFrame
que representa dimensiones de cajas a ser vendidas en un almacén.
In [90]:
dimension1 = pd.DataFrame([168.7, 170.0, 150.3, 168.7, 145.2, 200.0, 175.4, 163.0, 230.0, 129.6, 178.2], columns = list('L'))
dimension1.rename(columns = {'L': 'Largo'}, inplace = True)
dimension2 = pd.DataFrame([68.3, 60.2, 65.0, 68.3, 45.9, 70.0, 75.1, 63.5, 65.2, 68.7, 78], columns = list('A'))
dimension2.rename(columns = {'A': 'Ancho'}, inplace = True)
dimension3 = pd.DataFrame([46.8, 47.0, 45.0, 46.8, 45.3, 40.9, 45.6, 43.8, 46.8, 49.0, 47.2], columns = list('A'))
dimension3.rename(columns = {'A': 'Alto'}, inplace = True)
dimensiones = pd.concat([dimension1, dimension2, dimension3], axis=1)
dimensiones
Out[90]:
Método de "Escala de característica simple": se divide cada valor por el
valor máximo para esa característica, $x_{nuevo} = \frac{x_{viejo}}{x_{máximo}}$
In [91]:
dimensiones['Largo'] = dimensiones['Largo']/dimensiones['Largo'].max()
dimensiones['Ancho'] = dimensiones['Ancho']/dimensiones['Ancho'].max()
dimensiones['Alto'] = dimensiones['Alto']/dimensiones['Alto'].max()
dimensiones
Out[91]:
Método Mínimo - Máximo: toma cada valor, $x_{viejo}$ le resta el mínimo
valor de esa característica y luego se divide por el rango de esa característica, es decir, $x_{nuevo} = \frac{x_{viejo} - x_{mínimo}}{x_{máximo} - x_{mínimo}}$
In [37]:
dimensiones['Largo'] = (dimensiones['Largo']-dimensiones['Largo'].min())/(dimensiones['Largo'].max() - dimensiones['Largo'].min())
dimensiones['Ancho'] = (dimensiones['Ancho']-dimensiones['Ancho'].min())/(dimensiones['Ancho'].max() - dimensiones['Ancho'].min())
dimensiones['Alto'] = (dimensiones['Alto']-dimensiones['Alto'].min())/(dimensiones['Alto'].max() - dimensiones['Alto'].min())
dimensiones
Out[37]:
Método Puntaje estándar:
In [92]:
dimensiones['Largo'] = (dimensiones['Largo']-dimensiones['Largo'].mean())/(dimensiones['Largo'].std())
dimensiones['Ancho'] = (dimensiones['Ancho']-dimensiones['Ancho'].mean())/(dimensiones['Ancho'].std())
dimensiones['Alto'] = (dimensiones['Alto']-dimensiones['Alto'].mean())/(dimensiones['Alto'].std())
dimensiones
Out[92]:
In [93]:
import numpy as np
df = pd.read_csv('Automobile_data.csv')
df.head()
Out[93]:
In [94]:
df.describe()
Out[94]:
Vamos a generar datos aleatoriamente y hacer un gráfico de caja.
In [95]:
np.random.seed(1500) #generación aleatoria números
dfb = pd.DataFrame(np.random.randn(10,5)) #DataFrame de dimensiones 10x5
dfb.boxplot(return_type='axes') #Grafico de caja de cada categoría.
dfb.head()
Out[95]:
Tomemos los datos del archivo Automobile_data.csv
para crear un gráfico de caja de 3 variables que definen las dimensiones de los automóviles.
In [97]:
x = df['length'] #Variable Largo
y = df['width'] #Variable Ancho
z =df['height'] #Variable Alto
dfbp = pd.DataFrame([x,y,z]).T #Creando un DataFrame con las dimensiones de los autosmóviles
dfbp.boxplot(fontsize=13, return_type='axes') #Gráfico de caja de las 3 variables
#Tarea!!!!! Normalice estos datos y haga el nuevo gráfico de caja
Out[97]:
Vamos a generar datos aleatoriamente y hacer un gráfico de barras.
In [98]:
np.random.seed(14000) #Generación de números aleatorios
pdhist = pd.Series(np.random.randn(1000)) #Serie de números aleatorios
pdhist.hist(normed=True) # Muestra las barras
pdhist.plot(fontsize=13, kind='kde') #Gráfico de barras (kde = Kernel Density Estimation plot. Haga la prueba con 'hist')
Out[98]:
Utilicemos los datos de Automobile_data.csv
para hacer un gráfico de barras o histograma de la variable price
(precio).
In [99]:
import matplotlib.pyplot as plt
p = df['price'] #Seleccionamos la variable price
pdf = pd.Series(p) #Convertimos la selección en una serie de Pandas
pdf.hist(normed=True) # Muestra las barras
pdf.plot(fontsize=11, kind = 'hist') #Gráfico de barras
plt.xlabel('Precio',fontsize=13)
plt.ylabel('Frecuencia', fontsize=13)
Out[99]:
Este gráfico de barras nos indica que hay un número alto de automóviles con precio menor a 10000, entre otras cosas .... ¿Qué cosas? ;)
Este gráfico de dispersión muestra la relación entre las variables tamaño del motor
y precio
.
In [102]:
import matplotlib.pyplot as plt
x= df['engine-size'] #Variable predictora
y= df['price'] #Variable objetivo o que deseamos predecir
plt.scatter(x, y) #Gráfico de dispersión en Matplotlib
plt.title('Gráfico de dispersión de Tamaño del motor Vs. Precio', fontsize=13)#Nombre del gráfico
plt.xlabel('Tamaño del motor', fontsize=13)#Etiquetal del eje-x
plt.ylabel('Precio', fontsize=13)#Etiqueta del eje-y
Out[102]:
Tomememos las dos variables del ejemplo anterior...
In [119]:
import matplotlib.pyplot as plt
from scipy import stats
x=df['engine-size'] #Variable predictora
y= df['price'] #Variable objetivo o que deseamos predecir
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
line = slope*x+intercept
plt.plot(x,y,'o', x, line)
ax = plt.gca()
fig = plt.gcf()
plt.xlabel('Tamaño del motor', fontsize=9)#Etiquetal del eje-x
plt.ylabel('Precio', fontsize=9)#Etiqueta del eje-y
plt.title('Gráfico de dispersión de Tamaño del motor Vs. Precio', fontsize=13)#Nombre del gráfico
Out[119]:
El gráfico de dispersión anterior revela que hay una relación lineal positiva entre el tamaño del motor y el precio del auto. Es decir, a medida que aumenta el tamaño del motor aumenta el precio.
Este gráfico de dispersión revela que hay una relación lineal negativa entre las millas que recorre el auto por combustible que usa y el precio del mismo. Es decir, mientras más millas por galón el auto es más económico.
In [121]:
import matplotlib.pyplot as plt
from scipy import stats
x=df['highway-mpg'] #Variable predictora
y= df['price'] #Variable objetivo o que deseamos predecir
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
line = slope*x+intercept
plt.plot(x,y,'o', x, line)
ax = plt.gca()
fig = plt.gcf()
plt.xlabel('Millas por galón en autopista', fontsize=9)#Etiquetal del eje-x
plt.ylabel('Precio', fontsize=9)#Etiqueta del eje-y
plt.title('Gráfico de dispersión de Millas por galón en autopista Vs. Precio', fontsize=13)#Nombre del gráfico
Out[121]:
Ahora calculemos el coeficiente de correlación y el p-valor entre las variables 'Caballos de Fuerza' y 'Precio' usando 'stats.pearson()'
In [118]:
from scipy import stats
stats.pearsonr(df['horsepower'], df['price'])
Out[118]:
Existe una fuerte correlación positiva entre las variables ya que el coeficiente de correlación es cercano a 1 y el p-valor es mucho menor que 0.001